package cn.itcast.service.impl;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import cn.itcast.bean.Person;
import cn.itcast.service.PersonService;

@Transactional
//事务是不要我们打开的，我们只需要在这里申明这个bean是需要事务管理的
public class PersonServiceBean implements PersonService {
	@PersistenceContext
	/*
	 * 这个注解是由JPA规范提供的，Spring对它也支持，它是用来注入entityManager这个对象
	 * Spring内部是怎样做的呢？当Spring解析到@PersistenceContext这个注解的时候，它会从
	 * 容器的entityManager中得到一个EntityManager对象，这个过程并不需要我们做，是Spring容器帮我们做的
	 */
	private EntityManager em;

	/*
	 * 对实体bean进行操作的话，就要用到entityManager这个对象
	 */

	public void save(Person person) {
		em.persist(person);
	}

	public void update(Person person) {
		em.merge(person);
	}

	public void delete(Integer personid) {
		em.remove(em.getReference(Person.class, personid));
	}

	@Transactional(propagation = Propagation.NOT_SUPPORTED, readOnly = true)
	public Person getPerson(Integer personid) {
		return em.find(Person.class, personid);
	}

	@Transactional(propagation = Propagation.NOT_SUPPORTED, readOnly = true)
	@SuppressWarnings("unchecked")
	public List<Person> getPersons() {
		return em.createQuery("select o from person o").getResultList();
	}

}
